package com.yuanzong.wuliu.service.admin.auth;

import com.yuanzong.wuliu.common.enums.status.StatusEnum;
import com.yuanzong.wuliu.common.exception.BusinessException;
import com.yuanzong.wuliu.common.utils.code.PhotoCodeUtils;
import com.yuanzong.wuliu.common.utils.password.MD5Utils;
import com.yuanzong.wuliu.common.vo.ApiResult;
import com.yuanzong.wuliu.controller.admin.auth.param.AdminAuthLoginParam;
import com.yuanzong.wuliu.controller.intercdeptor.AdminHandlerInterceptorAdapter;
import com.yuanzong.wuliu.model.system.user.SystemUser;
import com.yuanzong.wuliu.service.system.user.factory.SystemUserFactory;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class AdminAuthService {

    public ApiResult login(AdminAuthLoginParam param) throws Exception {
        // ===================================================================================//
        // ===== 参数校验
        // ===================================================================================//
        if (param == null) {
            throw new BusinessException("参数为空");
        }
        if (!param.getPhotoCode().equals(PhotoCodeUtils.photoCodeMap.get(param.getPhotoCodeKey()))) {
            throw new BusinessException("图片验证码错误");
        }
        SystemUser systemUser = SystemUserFactory.getSystemUserService().queryByUsername(param.getUsername());
        if (systemUser == null) {
            throw new BusinessException("用户名或密码错误");
        }
        if (!systemUser.getPassword().equals(MD5Utils.MD5(param.getPassword()))) {
            throw new BusinessException("用户名或密码错误");
        }
        PhotoCodeUtils.photoCodeMap.remove(param.getPhotoCodeKey());
        if (!systemUser.getStatus().equals(StatusEnum.IS_USE.getValue())) {
            throw new BusinessException("用户状态不可用");
        }
        // ===================================================================================//
        // ===== 业务执行
        // ===================================================================================//
        // 生成Token
        String token = MD5Utils.MD5(System.currentTimeMillis() + "");
        AdminHandlerInterceptorAdapter.setRuntimeUser(token, systemUser.getId());
        // 返回内容
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("token", token);
        systemUser.setPassword(null);
        resultMap.put("systemUser", systemUser);
        return ApiResult.success(resultMap);
    }
}
